import { Module, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from './auth/auth.module';
import { AuthMiddleware } from './common/middleware/auth.middleware';
import { JwtModule } from '@nestjs/jwt';
import { CalendarModule } from './calendar/calendar.module';
import { CommonModule } from './common/common.module';
/**
 * 
TypeOrmModule 是 NestJS 提供的一个模块，用于集成 TypeORM 以便在 NestJS 应用中使用 TypeORM 进行数据库操作。它的主要作用包括：

数据库连接配置： TypeOrmModule.forRoot() 方法用于配置数据库连接参数，如数据库类型、主机、端口、用户名、密码、数据库名等。

实体注册： TypeOrmModule.forFeature() 方法用于注册实体，使其可以在依赖注入系统中使用。

依赖注入： TypeOrmModule 使得 TypeORM 的 Repository 可以通过依赖注入的方式在服务中使用。

 */
@Module({
  // 导入模块数组，Nest会在启动时加载这些模块
  imports: [
    CommonModule,
    UsersModule,
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'admin',
      password: '123456',
      database: 'nest_db',
      autoLoadEntities: true,
      synchronize: false,
      logging: false
    }),
    AuthModule,
    JwtModule.register({
      secret: 'your-secret-key',
      signOptions: { expiresIn: '24h' },
    }),
    CalendarModule,
  ],
  // 控制器数组，Nest会实例化这些控制器并将它们注册为处理HTTP请求的路由
  controllers: [AppController],
  // 提供者数组，Nest会实例化这些提供者并将它们注册到依赖注入系统中
  providers: [AppService],
})
export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(AuthMiddleware)
      .exclude(
        { path: 'users', method: RequestMethod.POST },
      )
      .forRoutes('users');
  }
}
